package com.jt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.annotation.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.service.ItemCatService;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

@Service
public class ItemCatServiceImpl implements ItemCatService {

    @Autowired
    private ItemCatMapper itemCatMapper;

    @Autowired(required = false)//类似于懒加载
    private Jedis jedis;


    /** （不通用，应该用aop）
     *  添加缓存
     *      1、定义key ITEM_CAT_PARENT::0
     *      2、查询缓存
     *          有 true 获取缓存数据后，将json转化成对象，之后返回
     *          meiy false 应该查询数据库，之后将数据保存到redis中，默认30天
     * @param parentId
     * @return
     */
    @Override
    public List<EasyUITree> findItemCatCache(Long parentId) {
        long t1 = System.currentTimeMillis();
        //定义返回类型
        List<EasyUITree> treeList = new ArrayList<>();
        //1、定义key
        String key ="ITEM_CAT_PARENT::"+parentId;
        //2、查询缓存
        if(jedis.exists(key)){
            //存在 从redis中获取数据
            String json = jedis.get(key);
            treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
            long t2 = System.currentTimeMillis();
            System.out.println("查询缓存，执行时长"+(t2-t1));
        }else {
            //不存在 先查询数据库在保存在redis中
            treeList = findItemCatList(parentId);
             String json = ObjectMapperUtil.toJson(treeList);
             jedis.setex(key,7*24*60*60,json);
            long t2 = System.currentTimeMillis();
            System.out.println("查询数据库，执行时长"+(t2-t1));
        }

        return treeList;
    }

    /**基于id获取分类信息*/
    @CacheFind(key ="ITEM_CAT_PARENT",seconds =7*24*60*60)
    @Override
    public List<EasyUITree> findItemCatList(Long parentId) {
        //思路.返回值的数据从哪来? VO  转化 POJO数据

        //1.实现数据库查询
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("parent_id",parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        //2.准备返回值数据
        List<EasyUITree> treeList = new ArrayList<>();
        //3.实现数据的转化  catList转化为 treeList
        for (ItemCat itemCat : catList){
            Long id = itemCat.getId();  //获取ID值
            String text = itemCat.getName();    //获取商品分类名称
            //判断:如果是父级 应该closed  如果不是父级 则open
            String state = itemCat.getIsParent()?"closed":"open";
            EasyUITree easyUITree = new EasyUITree(id,text,state);

            treeList.add(easyUITree);
        }

        return treeList;
    }


    /**1、基于商品分类id查询name*/
    @Override
    public String findItemCatName(Long itemCatId) {
        return itemCatMapper.selectById(itemCatId).getName();
    }
}


